#include "mainwindow.h"
#include <QToolBar>
#include <QToolButton>
#include <QVBoxLayout>
#include <QButtonGroup>
#include <QFileDialog>
#include <QMessageBox>
#include <QCloseEvent>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui_(new Ui::MainWindow)
    , modbusManager_(new ModbusManager(this))
{
    ui_->setupUi(this);
    setWindowTitle("综合平台编辑器");
    setWindowIcon(QIcon(":/resource/image/editor.png"));
    // HMI模块
    hmi_ = new HMIModule(ui_, modbusManager_, this);
    hmi_->init();

    // PLC模块
    plc_ = new PlcModule(ui_, modbusManager_, this);
    plc_->init();

    // 连接 HMIModule 的信号到 MainWindow 的槽
    connect(hmi_, &HMIModule::logMessageGenerated, this, &MainWindow::appendLog);

    // 新建/打开/保存文件
    connect(ui_->actionNew, &QAction::triggered, this, &MainWindow::onNewFile);
    connect(ui_->actionOpen, &QAction::triggered, this, &MainWindow::onOpenFile);
    connect(ui_->actionSave, &QAction::triggered, this, &MainWindow::onSaveFile);

    connect(ui_->actionStart, &QAction::triggered, this, &MainWindow::startSimulation);
    connect(ui_->actionStop, &QAction::triggered, this, &MainWindow::stopSimulation);
}

MainWindow::~MainWindow()
{
    if (modbusManager_) {
        modbusManager_->stopSimulation();
        modbusManager_->disconnect(); // 断开连接
    }
    delete ui_;
}

// 实现槽函数
void MainWindow::appendLog(const QString& message)
{
    ui_->textEdit->append(message);
}

// 辅助函数：获取当前激活的模块
QObject* MainWindow::getCurrentModule()
{
    // 根据当前选中的tab索引决定操作哪个模块
    int currentTab = ui_->tabWidget->currentIndex();

    if (currentTab == 0)
    {  // PLC页面
        return plc_;
    } else if (currentTab == 1)
    {  // HMI页面
        return hmi_;
    }
    return nullptr;  // 其他
}

// 新建菜单动作槽函数
void MainWindow::onNewFile()
{
    QObject* currentModule = getCurrentModule();
    if (!currentModule)
    {
        return;
    }
    // 转换为HMI模块
    HMIModule* hmiModule = qobject_cast<HMIModule*>(currentModule);
    // 转换为PLC模块
    PlcModule* plcModule = qobject_cast<PlcModule*>(currentModule);

    // 检查修改状态
    bool modified = false;
    if (hmiModule)
    {
        modified = hmiModule->isModified();
    }
    else if (plcModule)
    {
        modified = plcModule->isModified();
    }

    if (modified)
    {
        auto ret = QMessageBox::warning(this, "提示", "当前文件有未保存的更改，是否保存？",
                                        QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);

        if (ret == QMessageBox::Save)
        {
            onSaveFile();  // 保存当前文件
        }
        else if (ret == QMessageBox::Cancel)
        {
            return;  // 取消新建
        }
    }

    // 执行新建操作
    if (hmiModule)
    {
        hmiModule->resetPages();
    }
    else if (plcModule)
    {
        plcModule->resetDiagram();
    }
}

// 获取文件过滤器
QString MainWindow::getFileFilter(QObject* module)
{
    if (qobject_cast<HMIModule*>(module))
    {
        return "HMI文件 (*.hmi)";
    }
    else if (qobject_cast<PlcModule*>(module))
    {
        return "PLC文件 (*.plc)";
    }
    return "";
}

// 执行文件操作
bool MainWindow::fileOperation(QObject* module, const QString& fileName, bool isOpen)
{
    if (auto hmiModule = qobject_cast<HMIModule*>(module))
    {
        return isOpen ? hmiModule->openFromFile(fileName) : hmiModule->saveToFile(fileName);
    }
    else if (auto plcModule = qobject_cast<PlcModule*>(module))
    {
        return isOpen ? plcModule->openFromFile(fileName) : plcModule->saveToFile(fileName);
    }
    return false;
}

void MainWindow::onOpenFile()
{
    QObject* module = getCurrentModule();
    if (!module) return;

    // 获取文件过滤器
    QString filter = getFileFilter(module);
    if (filter.isEmpty()) return;

    // 获取文件名
    QString fileName = QFileDialog::getOpenFileName(this, "打开文件", "../../../file/", filter);
    if (fileName.isEmpty()) return;

    // 执行打开操作
    bool isSuccess = fileOperation(module, fileName, true);

    if (!isSuccess)
    {
        QMessageBox::warning(this, "打开失败", "文件打开失败");
    }
}

void MainWindow::onSaveFile()
{
    QObject* module = getCurrentModule();
    if (!module) return;

    // 获取文件过滤器
    QString filter = getFileFilter(module);
    if (filter.isEmpty()) return;

    // 获取文件名
    QString fileName = QFileDialog::getSaveFileName(this, "保存文件", "../../../file/", filter);
    if (fileName.isEmpty()) return;

    // 执行保存操作
    bool isSuccess = fileOperation(module, fileName, false);

    if (!isSuccess)
    {
        QMessageBox::warning(this, "保存失败", "文件保存失败！");
    }
}

void MainWindow::startSimulation()
{
    if (modbusManager_)
    {
        // 启动Modbus仿真
        modbusManager_->startSimulation("COM20", 19200, QSerialPort::EvenParity, QSerialPort::Data8, QSerialPort::OneStop);
    }
}

void MainWindow::stopSimulation()
{
    if (modbusManager_)
    {
        modbusManager_->stopSimulation();
    }
}
